﻿using System;
using MAF.Common;
using MAF.CRUD;

namespace My.Blog.Repository
{
    /// <summary>
    /// 用于选择不同的存储模块
    /// 由模块和处理程序共同定位一个存储工厂
    /// </summary>
    [Obsolete("可能实现数据库版本的时候还有些用，暂时保留，2012-10-25")]
    public class StorageFactory
    {
        public virtual ICRUD<MyBlog> CreateBlog()
        {
            return new MemoryCRUD<MyBlog>();
        }

        //public virtual ICRUD<CategoryInfo> CreateCategory()
        //{
        //    return new MemoryCRUD<CategoryInfo>();
        //}

        public virtual ICRUD<Article> CreateArticle()
        {
            return new MemoryCRUD<Article>();
        }

        public virtual ICRUD<Comment> CreateComment()
        {
            return new MemoryCRUD<Comment>();
        }

        /// <summary>
        /// 抽象工厂实现单例模式
        /// </summary>
        protected StorageFactory() { }
        public static StorageFactory GetInstance()
        {
            string storageType = "Memory";
            string module = "Blog";  // 目前只有一个模块，当有模块增加时，将此变量提升成参数

            switch (module)
            {
                case "Blog":
                    // 可以在这里选择多种不同的数据库，但是会在多个模块中造成重复代码，目前尚无解决方案
                    if ("Memory" == storageType)
                        return new StorageFactory();
                    else
                        return new BlogStorageFactory(); 
                default:
                    throw new ArgumentException(string.Format("不支持“{0}”模块，是不是在UI中忘了为Module字段赋值？", module));
            }
        }
    }
    
    /// <summary>
    /// 博客模块的工厂
    /// </summary>
    [Obsolete("可能实现数据库版本的时候还有些用，暂时保留，2012-10-25")]
    public class BlogStorageFactory : StorageFactory
    {
        public override ICRUD<MyBlog> CreateBlog()
        {
            return null;
            //return new BlogDao("SqlMap.config", "Blogs");
        }

        //public override ICRUD<CategoryInfo> CreateCategory()
        //{
        //    return null;
        //    //return new CategoryDao("SqlMap.config", "Categories");
        //}

        public override ICRUD<Article> CreateArticle()
        {
            return null;
            //return new ArticleDao("SqlMap.config", "Articles");
        }

        public override ICRUD<Comment> CreateComment()
        {
            return null;
            //return new CommentDao("SqlMap.config", "Comments");
        }
    }

    /// <summary>
    /// 博客资源库
    /// </summary>
    public static class BlogRepo
    {
        public static IRepository<MyBlog> Blogs { get; private set; }
        public static IRepository<Article> Articles { get; private set; }
        public static IRepository<Comment> Comments { get; private set; }
        public static IRepository<CategoryInfo> Categories { get; private set; }

        static BlogRepo()
        {
            Blogs = new MemRepo<MyBlog>();
            Articles = new MemRepo<Article>();
            Comments = new MemRepo<Comment>();
            Categories = new MemRepo<CategoryInfo>();
        }

        
    }
}